/*================================================================
*   Copyright (C) 2024 baichao All rights reserved.
*
*   文件名称：shmat.c
*   创 建 者：baichao
*   创建日期：2024年05月19日
*   描    述：
*
================================================================*/

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/shm.h>
#include <sys/types.h>

#define MYKEY 0x3333

int main() {
  int shmid;
  void *ptr = NULL;
  shmid = shmget(MYKEY, 4096, IPC_CREAT | IPC_EXCL | 0640);
  if (shmid == -1) {
    if (errno != EEXIST) {
      fprintf(stderr, "shmget returned %d (%d: %s)\n", shmid, errno,
              strerror(errno));
      return 1;
    } else {
      shmid = shmget(MYKEY, 4096, 0);
      if (shmid == -1) {
        fprintf(stderr, "shmget returned %d (%d: %s)\n", shmid, errno,
                strerror(errno));
        return 2;
      }
    }
  }
  fprintf(stdout, "shmid = %d\n", shmid);
  ptr = shmat(shmid, NULL, SHM_RND);
  if (ptr == (void *)-1) {
    fprintf(stderr, "shmat return NULL, errno (%d: %s)\n", errno,
            strerror(errno));
    return 2;
  }
  fprintf(stdout, "shmat returned %p\n", ptr);
  sleep(10);
  shmdt(ptr);
  return 0;
}
